#include <iostream>
#include <functional>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cerrno>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
using namespace std;

typedef function<void()> func;
vector<func> callbacks;
int cnt = 0;

void CatchSig(int signum){
    printf("[%d]: %s signum:%d\n", getpid(), "进程捕捉到了一个信号，正在处理中...", signum);
    for(auto& f : callbacks)
    {
        f();
    }
    alarm(3);
}

void Usage(){
    cout << "./mykill <signum> <pid>" << endl;
}

void Func1(){
    cout << "执行功能1...." << endl;
}

void Func2(){
    cout << "执行功能2...." << endl;
}

void Func3(){
    cout << "执行功能3...." << endl;
}

void Load(){
    callbacks.push_back(Func1);
    callbacks.push_back(Func2);
    callbacks.push_back(Func3);
}


void handler(int signum)
{
    printf("[%d]: %s signum:%d\n", getpid(), "进程捕捉到了一个信号！", signum);
    sleep(1);
}


int main(int argc, char** argv){
    //测试一：
    // signal(SIGINT, CatchSig);
    // while(true)
    // {
    //     printf("[%d]: 进程正在运行...\n", getpid());
    //     sleep(1);
    // }

    //测试二：
    // cout << "pid: " << getpid() << endl;
    // int x = 4;
    // x/=0; //除0错误

    //测试三：
    // pid_t id = fork();
    // if(id == 0)
    // {
    //     int x = 4;
    //     x/=0;
    //     exit(1);
    // }
    // int status = 0;
    // waitpid(id, &status, 0);

    // if(WIFEXITED(status))
    // {
    //     printf("exit_code: %d\n", WEXITSTATUS(status));
    // }
    // else
    // {
    //     printf("texit_signal: %d\tcore_dump: %d\n", status&(0x7f), (status>>7)&1);
    // }

    //测试四：
    // if(argc != 3)
    // {
    //     Usage();
    //     exit(1);
    // }
    // int signum = stoi(argv[1]);
    // int procid = stoi(argv[2]);
    // kill(procid, signum);

    //测试五：
    // int pipefd[2] = {0};
    // pipe(pipefd);
    // pid_t id = fork();
    // if(id == 0)
    // {
    //     close(pipefd[0]);
    //     char wbuff[128] = "hello world!";
    //     while(true) //写端死循环
    //     {
    //         write(pipefd[1], wbuff, strlen(wbuff));
    //         sleep(1);
    //     }
    //     close(pipefd[1]);
    //     exit(0);
    // }

    // close(pipefd[1]);
    // char rbuff[128];
    // int cnt = 5;
    // while(cnt--) //读端读5秒结束，并关闭读端
    // {
    //    ssize_t sz = read(pipefd[0], rbuff, sizeof(rbuff)-1);
    //    if(sz > 0)
    //    {
    //         rbuff[sz] = 0;
    //         cout << "chlid process: " << rbuff << endl;
    //    }
    //    else if(sz == 0)
    //    {
    //         cout << "writer quit! me quit!" << endl;
    //         break;
    //    }
    //    else
    //    {
    //      perror("read");
    //      exit(errno);
    //    }
    //    sleep(1);
    // }
    // close(pipefd[0]);
    // int status = 0;
    // waitpid(id, &status, 0);
    // if(WIFEXITED(status))
    // {
    //     printf("cpid: %d\texit_code: %d\n", id, WEXITSTATUS(status));
    // }
    // else
    // {
    //     printf("cpid: %d\texit_signal: %d\tcore_dump: %d\n", id, status&(0x7f), (status >> 7) & 1);
    // }

    //测试六：
    // Load();
    // //注册信号处理程序
    // signal(SIGALRM, CatchSig); 
    // //设置一个定时器
    // alarm(3);
    // while(true)
    // {
    //     printf("[%d]: 进程正在运行...\n", getpid());
    //     sleep(1);
    // }

    //测试七：
    // signal(SIGFPE, handler);
    // int x = 0;
    // x /= 0; //除0错误

    //测试八：
    // signal(SIGSEGV, handler);
    // int* pi = nullptr;
    // *pi = 100;

    //测试九：
    signal(SIGABRT, handler);
    // int* pi = nullptr;
    // *pi = 100;
    while(1) sleep(1);

    return 0;
    
}